perm filename UDPDIR.FAI[KID,KMC] blob
sn#122896 filedate 1974-11-15 generic text, type T, neo UTF8
TITLE UDPDIR ;THIS PROG PUTS THE KMC-UDP DIRECTORY IN READABLE FORM.
A←1
B←2
C←3
P←7
CNT←10
PNT←11
UDPCHN←←1
LPTCHN←←2
PAKST←←1 ;FIRST BLOCK OF KIDS AREA
PDL: BLOCK =10
START: ;START BY INIT-ING THE DEVICES.
INIT UDPCHN,17 ;DUMP MODE OF COURSE
SIXBIT /UDP/
0
JRST [OUTSTR [ASCIZ /CANNOT INIT UDP/]
CALL [SIXBIT /EXIT/]]
INIT LPTCHN,0 ;CHARACTER PUSHING MODE.
SIXBIT /LPT/
XWD OBUF,0
JRST [OUTSTR [ASCIZ /CANNOT INIT LPT/]
HALT]
MOVE P,[IOWD 7,PDL]
;NOW READ THE UDP DIRECTORY BLOCK.
IN UDPCHN,[IOWD =2336,DIRECT
PAKST]
JRST .+2
JRST [OUTSTR [ASCIZ /ERROR ON UDP READ/]
CALL [SIXBIT /EXIT/]]
;CHECK THAT WORDS 0 AND 2 (NO. OF ENTRIES AND NEXT FREE BLOCK)
;ARE REASONABLE NONNEGATIVE NUMBERS.
MOVE A,DIRECT
JUMPL A,[OUTSTR [ASCIZ /NEGATIVE NO. OF ENTRIES/]
HALT]
CAILE A,=1164 ;NO MORE THAN 1164 DIRECTORY ENTRIES
JRST [OUTSTR [ASCIZ /NUMBER OF ENTRIES TOO LARGE/]
HALT]
MOVE A,DIRECT+2
JUMPL A,[OUTSTR [ASCIZ /WORD 2 IS NEGATIVE/]
HALT]
CAILE A,=4000 ;TEST IF IMPOSSIBLE BLOCK NO.
JRST [OUTSTR [ASCIZ /WORD 2 TOO LARGE/]
HALT]
;NEXT PRINT THE DIRECTORY HEADING.
PUSHJ P,HEAD ;DO IT.
;NOW LOOP THE NUMBER OF TIMES GIVEN BY [DIRECT]
MOVE CNT,DIRECT ;LOOP COUNT.
MOVEI PNT,4 ;ADDRESS OF FIRST ENTRY
LOOP: JUMPE CNT,LOOPX ;GET OUT WHEN COUNT=0
MOVE B,DIRECT
SUB B,CNT ;GET FILE NUMBER.
IDIVI B,=40 ;WANT 40 LINES PER PAGE
SUBI C,=39 ;WANT TO DETECT EVERY 40TH LINE.
JUMPN C,.+4
MOVEI B,014 ;FORM FEED CHAR.
PUSHJ P,PUTCHR ;O/P IT
PUSHJ P,HEAD ;PAGE HEADING
MOVEI A,7
PUSHJ P,TAB
MOVE A,DIRECT
SUB A,CNT ;GET FILE NUMBER.
PUSHJ P,INTGER ;PRINT FILE NUMBER
MOVEI A,=19
PUSHJ P,TAB
MOVE A,DIRECT(PNT)
PUSHJ P,SIXSTR ;PRINT FILE NAME
MOVEI A,=38
PUSHJ P,TAB
HRRZ A,DIRECT+1(PNT) ;BLOCK NUMBER
PUSHJ P,INTGER ;PRINT IT
MOVEI A,=58
PUSHJ P,TAB
HLRZ A,DIRECT+1(PNT) ;FILE LENGTH
PUSHJ P,INTGER ;PRINT IT
PUSHJ P,NEWLN
SUBI CNT,1 ;BUMP COUNT
ADDI PNT,2 ;BUMP POINTER.
JRST LOOP
LOOPX: ;THE INFO FOR THE CURRENT ENTRY IS OUT.
PUSHJ P,NEWLN
MOVEI A,[ASCIZ /END OF DIRECTORY - /]
PUSHJ P,TEXT
MOVEI A,[ASCIZ /NUMBER OF FREE BLOCKS = /]
PUSHJ P,TEXT
MOVEI A,=4000
SUB A,DIRECT+2
PUSHJ P,INTGER
PUSHJ P,NEWLN
RELEAS UDPCHN,0
RELEAS LPTCHN,0
CALL [SIXBIT /EXIT/]
PUTCHR: AOS CHCNT ;ROUTINE TO SHOVE THE CHAR IN B
SOSG OBUF+2
OUT LPTCHN,
JRST PUTCH1
HALT
PUTCH1: IDPB B,OBUF+1
POPJ P,
OBUF: BLOCK 3
CHCNT: 0 ;CHARACTER COUNT FOR TAB ROUTINE.
TAB: ;TAB ROUTINE - PUT OUT SPACES UNTIL CHCNT GT AREG
CAMG A,CHCNT
POPJ P, ;CH COUNT AT LEAST AS LARGE AS [A]
MOVEI B,040 ;CODE FOR SPACE.
PUSHJ P,PUTCHR
JRST TAB
INTGER: ;ROUTINE TO SHOVE THE INTEGER IN A.
MOVE B,A ;USEFUL HERE
JUMPL B,NPN ;BALK AT NEGATIVE NUMBERS.
CAIL B,=1000000
JRST NPN
CAIL B,=100000
JRST INT1
CAIL B,=10000
JRST INT2
CAIL B,=1000
JRST INT3
CAIL B,=100
JRST INT4
JRST INT5
INT1: IDIVI B,=100000
PUSHJ P,INT9
INT2: IDIVI B,=10000
PUSHJ P,INT9
INT3: IDIVI B,=1000
PUSHJ P,INT9
INT4: IDIVI B,=100
PUSHJ P,INT9
INT5: IDIVI B,=10
PUSHJ P,INT9
INT6: IDIVI B,=1
PUSHJ P,INT9
POPJ P,
INT9: ADDI B,060 ;RECODE SO DIGITS ARE DIGITS.
PUSHJ P,PUTCHR
MOVE B,C
POPJ P,
NPN: ;NON PRINTABLE INTEGER.
MOVEI A,[ASCIZ /******/]
JRST TEXT
NEWLN: MOVEI B,015
PUSHJ P,PUTCHR
MOVEI B,012
PUSHJ P,PUTCHR
SETZM CHCNT
POPJ P,
TEXT: ;OUTPUT THE ASCIZ STRING POINTED TO BY REG A.
HLL A,[POINT =7,0]
TEX1: ILDB B,A
JUMPE B,TEX2 ;ESCAPE LOOP WHEN ZERO BYTE COMES ALONG
PUSHJ P,PUTCHR
JRST TEX1
TEX2: POPJ P,
SIXSTR: ;OUTPUT A WORD OF SIXBIT CHARACTERS
MOVEM A,SIXTMP
MOVE A,[POINT 6,SIXTMP]
SIX1: ILDB B,A
JUMPE B,SIX2 ;ESCAPE LOOP AT SPACE CHAR
ADDI B,040 ;GET ASCII VERSION
PUSHJ P,PUTCHR
JRST SIX1
SIX2: POPJ P,
SIXTMP: 0
0
DATE: ;THE CONTENTS OF REGISTER A IS A DATE IN PDP10 FORM
;OUTPUT IT IN READABLE FORM.
IDIVI A,=31
ADDI B,1
MOVEM B,DAY ;THE DAY OF THE MONTH
IDIVI A,=12
MOVEM B,MONTH ;THE MONTH NUMBER - 1
ADDI A,=64 ;THE YEAR NUMBER.
MOVEM A,YEAR
MOVE A,MONTH
MOVE A,MTHNAM(A) ;MONTH NAME
PUSHJ P,SIXSTR
MOVEI B,055 ;MINUS SIGN
PUSHJ P,PUTCHR
MOVE A,DAY
PUSHJ P,INTGER
MOVEI B,055 ;MINUS SIGN
PUSHJ P,PUTCHR
MOVE A,YEAR
PUSHJ P,INTGER
POPJ P, ;DECLARE VICTORY AND GET OUT
MONTH: 0
DAY: 0
YEAR: 0
MTHNAM: SIXBIT /JAN/
SIXBIT /FEB/
SIXBIT /MAR/
SIXBIT /APR/
SIXBIT /MAY/
SIXBIT /JUN/
SIXBIT /JUL/
SIXBIT /AUG/
SIXBIT /SEP/
SIXBIT /OCT/
SIXBIT /NOV/
SIXBIT /DEC/
HEAD: ;ROUTINE TO WRITE A PAGE HEADING
PUSHJ P,NEWLN ;CRLF
MOVEI A,[ASCIZ /UDP DIRECTORY /]
PUSHJ P,TEXT
PUSHJ P,NEWLN
MOVEI A,[ASCIZ /THE DATE TODAY IS (/]
PUSHJ P,TEXT
CALL A,[SIXBIT /DATE/]
PUSHJ P,DATE
MOVEI A,[ASCIZ /) AND THE DATE ON THE UDP IS (/]
PUSHJ P,TEXT
MOVE A,DIRECT+1
PUSHJ P,DATE
MOVEI A,[ASCIZ /)/]
PUSHJ P,TEXT
PUSHJ P,NEWLN
PUSHJ P,NEWLN
MOVEI A,[ASCIZ / FILE NUMBER FIL/]
PUSHJ P,TEXT
MOVEI A,[ASCIZ /E NAME ADDRESS/]
PUSHJ P,TEXT
MOVEI A,[ASCIZ / OF THE FILE /]
PUSHJ P,TEXT
MOVEI A,[ASCIZ /LENGTH /]
PUSHJ P,TEXT
PUSHJ P,NEWLN
MOVEI A,[ASCIZ / /]
PUSHJ P,TEXT
MOVEI A,[ASCIZ / FIRST/]
PUSHJ P,TEXT
MOVEI A,[ASCIZ / BLOCK (WO/]
PUSHJ P,TEXT
MOVEI A,[ASCIZ /RDS) /]
PUSHJ P,TEXT
PUSHJ P,NEWLN
PUSHJ P,NEWLN
POPJ P,
DIRECT: BLOCK =2338 ;SPACE FOR 1 UDP BLOCK + 2WDS.
END START